Nesse laboratório utilizamos dados referentes aos alunos que já concluíram o curso de Ciência da Computação - UFCG. Nele se encontram, de cada aluno, todas as médias finais obtidas em cada disciplina (5-10), assim como o coeficiente de rendimento acadêmico (cra, ~4-10).
Queremos realizar análises de regressão utilizando as disciplinas dos dois primeiros períodos e cra na tentativa de responder a seguinte pergunta:
O desempenho dos alunos nos dois primeiros períodos consegue explicar, em algum grau, seus desempenhos no curso como um todo?
Para isso, construiremos um modelo de regressão com disciplinas do primeiro e segundo período. Ao longo desse documento iremos responder perguntas a respeito do modelo e realizar comparações. Logo abaixo um breve resumo de como se distribuem as variáveis quando relacionadas e seus respectivos coeficientes de correlação.
Legenda
graduados = read.csv("graduados_disciplinas.csv")
graduados = graduados[, c("Cálculo.Diferencial.e.Integral.I", "Álgebra.Vetorial.e.Geometria.Analítica", "Leitura.e.Produção.de.Textos", "Programação.I", "Laboratório.de.Programação.I", "Introdução.à.Computação", "Cálculo.Diferencial.e.Integral.II", "Matemática.Discreta", "Programação.II", "Laboratório.de.Programação.II", "Teoria.dos.Grafos", "Fundamentos.de.Física.Clássica", "cra")]
colnames(graduados) = c("Cálculo.1", "Vetorial", "LPT", "P1", "LP1", "IC", "Cálculo.2", "Discreta", "P2", "LP2", "Grafos", "Física.3", "cra")
ggpairs(na.omit(graduados), lower = list(continuous = "smooth"), upper = list(continuous = wrap("cor", size = 10)))
# ggcorr(graduados1[, 2:8], geom = "circle", nbreaks = 5)
# ggcorr(graduados1[, 2:8], nbreaks = 5, label = TRUE, label_size = 3, label_round = 2, label_alpha = TRUE)
Para responder esta pergunta criamos um modelo de regressão linear múltipla que englobe todas disciplinas como variáveis independentes e o cra como variável dependente. Após a criação do modelo, obtemos um resumo do mesmo com suas principais características relacionadas a efetividade.
rl = lm(cra ~ ., data = graduados)
summary(rl)
##
## Call:
## lm(formula = cra ~ ., data = graduados)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.8273 -0.2988 0.1069 0.2796 1.0032
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.33894 0.59783 2.240 0.02758 *
## Cálculo.1 0.02121 0.04907 0.432 0.66661
## Vetorial 0.04443 0.04762 0.933 0.35327
## LPT 0.09172 0.05167 1.775 0.07925 .
## P1 -0.02593 0.07684 -0.337 0.73660
## LP1 -0.02472 0.07450 -0.332 0.74082
## IC 0.10196 0.08639 1.180 0.24098
## Cálculo.2 -0.00100 0.05302 -0.019 0.98499
## Discreta 0.23935 0.05863 4.083 9.63e-05 ***
## P2 0.29214 0.09553 3.058 0.00293 **
## LP2 -0.02848 0.06666 -0.427 0.67024
## Grafos 0.09620 0.06302 1.526 0.13040
## Física.3 -0.01024 0.06120 -0.167 0.86745
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.5046 on 90 degrees of freedom
## (309 observations deleted due to missingness)
## Multiple R-squared: 0.6889, Adjusted R-squared: 0.6474
## F-statistic: 16.61 on 12 and 90 DF, p-value: < 2.2e-16
Utilizamos o Residual standart error (RSE) para interpretar parte do nosso modelo. RSE é o desvio padrão dos resíduos que descreve a variabilidade referente ao modelo de regressão utilizado. Queremos que o valor RSE seja o menor possível. O RSE do modelo tem valor igual a 0.5046.
Uma segunda variável que utilizamos é o R-quadrado que apresenta valor referente ao coeficiente de determinação, ela varia entre 0-1 e indica quanto o modelo consegue explicar o valor observado, no nosso caso, o cra. Quanto maior o R-quadrado, melhor, significando que o modelo é mais explicativo. Existe um tendência de que quanto mais variáveis o modelo possuir, maior o seu poder explicativo, incentivando a inserção de muitas variáveis e para combater isso existe o R-quadrado ajustado. R-quadrado ajustado funciona da mesma maneira que o R-quadrado, com a diferença de que ele sofre penalização se há inclusão de variáveis com muito pouco poder explicativo. Para todos os modelos deste documento estaremos utilizando valores relacionados ao R-quadrado ajustado para medir o poder de explicação dos mesmos.
Interpretandos os dados acima temos que o R-quadrado ajustado tem valor igual a 0.6474, isso signigica que 64.74% do cra consegue ser explicado pelas variáveis independentes presentes no modelo. Então, sim, o modelo explica parte da variável dependente em mais de 50%.
Apesar de o modelo explicar a variável dependente em quase 67%, nem todas as variáveis independentes que fazem parte dele apresentam influência considerável. Neste documento, utilizaremos dois principais valores para avaliar a utilidade e significância de uma variável independente presente em um modelo: seu coeficiente (relacionado a magnitude) e p-valor.
O coeficiente de uma variável é referênte ao poder de influência que ela tem na variável dependente. O p-valor é referente a probabilidade de exisência por chance, queremos que este valor seja o menor possível para que a variável seja considerada importante para o modelo.
Disciplinas como Física 3, Cálculo 2, Cálculo 1 etc, apresentam baixo coeficiente e p-valor elevado. Essas variáveis influenciam minimamente e não são consideradas úteis para o modelo. Portanto, nem todas as variáveis são úteis para o modelo de regressão apresentado.
Selecionaremos variáveis baseadas em seus coeficientes e p-valor. Além disso, quando duas variáveis possuírem um alto coeficiente de correlação**, removeremos uma delas, já que váriáveis muito correlacionadas inserem redundância no modelo e podem proporcionar geração de valores incosistentes. Utilizaremos o summary do modelo e o correlograma abaixo para extrair e analisar esses valores.
**Um valor será considerado alto quando for >= 0.65. Valor escolhido com base na comparação relativa de coeficientes obtidos.
M = cor(na.omit(graduados[,1:12]))
corrplot(M, type = "lower", title = "Correlação de disciplinas", order="hclust", col=brewer.pal(n=7, name="PuOr"), addCoef.col = "black", tl.col="black", tl.srt=45, mar=c(0,0,1,0) )
#
# ggplot(graduados1, aes(graduados1$IC, graduados1$cra)) +
# geom_point(alpha = 0.1, position = position_jitter(width = 0.3), color="purple4") +
# labs(title="Previsão do modelo", x= "Nota em IC", y="CRA") +
# geom_line(aes(y = predict(rl1, graduados1)), colour = "red")
Iniciaremos removendo variáveis com alto coeficiente de correlação:
Agora removemos as variáveis menos significativas considerando menores valores referentes ao coeficiente e maiors referentes ao p-valor:
Sendo assim, nosso modelo fica da seguinte maneira:
graduados = graduados[, c("LPT", "P1", "IC", "Vetorial", "Discreta", "P2", "cra")]
rl = lm(cra ~ ., data = graduados)
summary(rl)
##
## Call:
## lm(formula = cra ~ ., data = graduados)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.26305 -0.24549 0.06888 0.34986 1.17262
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.07020 0.35305 3.031 0.002660 **
## LPT 0.09195 0.03479 2.643 0.008669 **
## P1 0.05407 0.03047 1.774 0.077052 .
## IC 0.19125 0.04939 3.872 0.000134 ***
## Vetorial 0.14360 0.02936 4.891 1.69e-06 ***
## Discreta 0.16460 0.03037 5.420 1.27e-07 ***
## P2 0.17707 0.03380 5.239 3.16e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.5342 on 284 degrees of freedom
## (121 observations deleted due to missingness)
## Multiple R-squared: 0.6006, Adjusted R-squared: 0.5921
## F-statistic: 71.17 on 6 and 284 DF, p-value: < 2.2e-16
O modelo agora apresenta um R-quadrado ajustado mais elevado, com valor igual a 0.5921, ou seja, ele explica em 59.21% a variável dependente. Por outro lado, o RSE teve seu valor elevado para 0,5342. Apesar disso, devido ao fato de que removemos variáveis, a quantidade de linhas com valores nulos diminuiu, aumentanto o tamanho da amostra e, consequentemente, a quantidade de graus de liberdade.
graduados1 = graduados[,c("Vetorial", "LPT", "P1", "IC", "cra")]
graduados2 = graduados[, c("Discreta", "P2", "cra")]
graduados1 = na.omit(graduados1)
graduados2 = na.omit(graduados2)
rl1 = lm(cra ~ ., data = graduados1)
rl2 = lm(cra ~ ., data = graduados2)
summary(rl1)
##
## Call:
## lm(formula = cra ~ ., data = graduados1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.57648 -0.30289 0.08898 0.38674 1.22632
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.29320 0.37856 3.416 0.000724 ***
## Vetorial 0.15711 0.03145 4.996 1.00e-06 ***
## LPT 0.11576 0.03687 3.139 0.001864 **
## P1 0.14305 0.03010 4.752 3.15e-06 ***
## IC 0.35370 0.04865 7.270 3.23e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.5841 on 296 degrees of freedom
## Multiple R-squared: 0.5154, Adjusted R-squared: 0.5089
## F-statistic: 78.71 on 4 and 296 DF, p-value: < 2.2e-16
summary(rl2)
##
## Call:
## lm(formula = cra ~ ., data = graduados2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.3370 -0.3236 0.1042 0.3816 1.4854
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.15763 0.26422 11.951 < 2e-16 ***
## Discreta 0.29418 0.02995 9.821 < 2e-16 ***
## P2 0.28134 0.03258 8.634 3.03e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.6216 on 314 degrees of freedom
## Multiple R-squared: 0.4637, Adjusted R-squared: 0.4603
## F-statistic: 135.8 on 2 and 314 DF, p-value: < 2.2e-16